package com.mm.seguridad.infrastructure.jdbc;


import com.google.common.base.Strings;
import com.googlecode.genericdao.search.Search;
import com.mm.seguridad.domain.model.Estado;
import com.mm.seguridad.domain.model.Usuario;
import com.mm.seguridad.domain.model.UsuarioRepository;
import com.mm.seguridad.dto.UsuarioDTO;
import com.mm.support.jpa.BaseDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


@Repository
public class UsuarioRepositoryImpl extends BaseDAO<Usuario, Long> implements UsuarioRepository {


    @Autowired
    DataSource dataSource;

    private static final Logger LOG = LoggerFactory.getLogger(UsuarioRepositoryImpl.class);

    public Usuario findByLoginAndPassword(String login, String password) {
        Usuario usuario = searchUnique(new Search()
                .addFilterEqual("login", login)
                .addFilterEqual("password", password)
                .addFilterEqual("estado", Estado.ACTIVO));

        if (usuario == null) {
            return null;

        }
        return usuario;
    }

    private static String appResourcePath= "META-INF/spring/application.properties";


    private static Properties props = null;

    public static Properties getAppPorperties() {

        if(props==null){
            try {
                props = ResourceProperties.getResourcePorperties(appResourcePath);
            } catch (IOException e) {

            }
        }
        return  props;
    }

    public static String getEmailFrom() {

        return  getAppPorperties().getProperty("mail.username");
    }

    public Integer existeToken(String tokenId) {
        Integer expiracion= new Integer(getAppPorperties().getProperty("token.expiracion"));

        return getJdbcTemplate().queryForInt("SELECT count(*) FROM dbo.SGTM_REPORTE_PUBLICO WHERE REPORTE_ID = ? and DATEDIFF(minute,FECHA_CREACION ,GETDATE()) <= ? ",
                new Object[]{new Long(tokenId),expiracion});
    }

    public Integer obtenerTipoToken(String tokenId) {
        return getJdbcTemplate().queryForInt("SELECT TIPO FROM dbo.SGTM_REPORTE_PUBLICO WHERE REPORTE_ID = ? ",
                new Object[]{new Long(tokenId)});
    }


    private JdbcTemplate getJdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }

    public List<Usuario> findByIds(List<Long> ids) {
        if (ids.isEmpty()) return new ArrayList<Usuario>();
        Search s = new Search();
        s.addFilterIn("id", ids);
        return search(s);
    }

    public List<UsuarioDTO> findByNameList(String name) {
        Search s = new Search();
        if (!Strings.isNullOrEmpty(name)) {
            s.addFilterILike("nombre", name.toUpperCase() + "%");
            s.addSortAsc("nombre");
        }
        s.addSortAsc("nombre");
        return search(s);


    }

    public List<Usuario> findByFilter(Usuario filter) {
        Search s = new Search();

        if (!Strings.isNullOrEmpty(filter.getNombreCompleto())) {
            s.addFilterILike("nombreCompleto", filter.getNombreCompleto() + "%");
        }
        if (filter.getTipoUsuario() != null) {
            s.addFilterILike("tipoUsuario", filter.getTipoUsuario().getCode() + "%");
        }
        if (!Strings.isNullOrEmpty(filter.getLogin())) {
            s.addFilterILike("login", filter.getLogin() + "%");
        }


        return search(s);
    }

    public void saveCadena(Usuario cadena) {
        this.persist(cadena);
    }

    public Usuario findBy(Long code) {
        Search s = new Search();
        if (code != null) {
            s.addFilterEqual("id", code);
        }
        return searchUnique(s);
    }

    public List<Usuario> findByRUC(String ruc) {
        Search s = new Search();
        if (ruc != null) {
            s.addFilterEqual("ruc", ruc);
        }

        return search(s);
    }


}
